home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / faq / wdj0597.zip / CONSOLE.ZIP / REDIRECT.C < prev   
C/C++ Source or Header  |  1997-02-20  |  3KB  |  136 lines

  1. /* Borland C++:
  2.  *  bcc32 -tWM -w redirect.c
  3.  * Visual C++:
  4.  *  cl /MT redirect.c user32.lib advapi32.lib
  5.  */
  6.  
  7. #define STRICT
  8. #include <windows.h>
  9. #include <process.h>
  10. #include <stdio.h>
  11. #include <conio.h>
  12.  
  13. typedef struct
  14. {
  15.   HANDLE hReadPipe;
  16.   FILE *fh;
  17. }
  18. Parameters,*PParameters;
  19.  
  20. BOOL IsWindowsNT(void)
  21. {
  22.   OSVERSIONINFO osv;
  23.  
  24.   osv.dwOSVersionInfoSize = sizeof(osv);
  25.   GetVersionEx(&osv);
  26.   return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
  27. }
  28.  
  29. void RedirectThread(LPVOID lpvThreadParam)
  30. {
  31.   BOOL fStatus;
  32.   char szBuffer[1];
  33.   DWORD dwBytesRead;
  34.   PParameters param = (PParameters)lpvThreadParam;
  35.  
  36.   while (TRUE)
  37.   {
  38.     fStatus = ReadFile(
  39.       param->hReadPipe,
  40.       szBuffer,
  41.       sizeof(szBuffer),
  42.       &dwBytesRead,
  43.       NULL
  44.       );
  45.     if (fStatus == TRUE)
  46.     {
  47.       szBuffer[dwBytesRead] = '\0';
  48.       fprintf(param->fh,"%s",szBuffer);
  49.     }
  50.     else
  51.     {
  52.       _endthread();
  53.     }
  54.   }
  55. }
  56.  
  57. void main(int argc,char *argv[])
  58. {
  59.   BOOL fStatus;
  60.   HANDLE hThread;
  61.   STARTUPINFO si;
  62.   Parameters param;
  63.   HANDLE hWritePipe;
  64.   char szBuffer[100];
  65.   PROCESS_INFORMATION pi;
  66.   SECURITY_ATTRIBUTES sa;
  67.   SECURITY_DESCRIPTOR sd;
  68.   LPSECURITY_ATTRIBUTES lpsa = NULL;
  69.  
  70.   if (argc < 3 || argc > 3)
  71.   {
  72.     printf("redirect [file name] [command]\n");
  73.     return;
  74.   }
  75.   if ((param.fh = fopen(argv[1],"w+t")) == NULL)
  76.   {
  77.     printf("Failed to create file: %s\n",argv[1]);
  78.     return;
  79.   }
  80.   if (IsWindowsNT() == TRUE)
  81.   {
  82.     // Create a security descriptor allowing inheritence of handles
  83.     InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
  84.     SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE);
  85.     sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  86.     sa.bInheritHandle = TRUE;
  87.     sa.lpSecurityDescriptor = &sd;
  88.     lpsa = &sa;
  89.   }
  90.   CreatePipe(¶m.hReadPipe,&hWritePipe,lpsa,1);
  91.   hThread = (HANDLE)_beginthread(
  92.     RedirectThread,
  93.     0,
  94.     ¶m
  95.     );
  96.   CloseHandle(hThread);
  97.   if (IsWindowsNT() == TRUE)
  98.   {
  99.     wsprintf(szBuffer,"cmd /c %s",argv[2]);
  100.   }
  101.   else
  102.   {
  103.     wsprintf(szBuffer,"command.com /c %s",argv[2]);
  104.   }
  105.   ZeroMemory(&si,sizeof(STARTUPINFO));
  106.   si.cb = sizeof(STARTUPINFO);
  107.   si.dwFlags = STARTF_USESTDHANDLES;
  108.   si.hStdOutput = hWritePipe;
  109.   si.hStdError = hWritePipe;
  110.  
  111.   fStatus = CreateProcess(
  112.     NULL,
  113.     szBuffer,
  114.     NULL,
  115.     NULL,
  116.     TRUE,
  117.     DETACHED_PROCESS, // No console window
  118.     NULL,
  119.     NULL,
  120.     &si,
  121.     &pi
  122.     );
  123.   CloseHandle(pi.hThread);
  124.   if (fStatus == FALSE)
  125.   {
  126.     printf("Failed to create process: %d\n",GetLastError());
  127.     return;
  128.   }
  129.   WaitForSingleObject(pi.hProcess,INFINITE);
  130.   CloseHandle(hWritePipe);
  131.   CloseHandle(param.hReadPipe);
  132.   CloseHandle(pi.hProcess);
  133.   fclose(param.fh);
  134.   return;
  135. }
  136.